package com.hspedu.generic;

import java.util.ArrayList;
import java.util.List;

/**
 * @author DL5O
 * @version 1.0
 */
public class Generic04 {
    private Pig<A> aPig2;

    public static void main(String[] args) {
        ArrayList<A> as = new ArrayList<A>();
        //说明：
        //因为 E指定了 A类型，这时传入A对象是可以的
        Pig<A> aPig = new Pig<A>(new A());

        //这时传入的是A的子类 B,这个B继承了A类型
        Pig<A> aPig1 = new Pig<A>(new A());
        aPig1.f1();

        Pig<A> aPig2 = new Pig<A>(new B());

        aPig2.f1();

        //第3个小细节
        List<Integer> integers = new ArrayList<Integer>();

        //在实际开发中，我们往往会简写，推荐写法
        //编译器会进行类型推断
        ArrayList<Integer> list4 = new ArrayList<>();
        List<Integer> list5 = new ArrayList<>();

        ArrayList<Pig> pigs = new ArrayList<>();
//        Tiger<Object> objectTiger = new Tiger<>("老虎"); 等价于下面的这个写法
        Tiger objectTiger = new Tiger("老虎");
    }
}

class A{

}

class B  extends A{

}

class Pig<E>{
    E e;

    public Pig(E e) {
        this.e = e;
    }

    public void f1(){
        System.out.println(e.getClass());//得到运行类型
    }
}

class Tiger<E>{
    E e;

    public Tiger(E e) {
        this.e = e;
    }
}